package com.ruoyi.common.tools.excel.listener;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.ruoyi.common.tools.constant.ERecordConstant;
import com.ruoyi.common.tools.excel.base.MyExcelListener;
import com.ruoyi.standingbook.v2toilet.ItemEnum;
import com.ruoyi.standingbook.v2toilet.ItemImageEnum;
import com.ruoyi.standingbook.v2toilet.ToiletConst;
import com.ruoyi.standingbook.v2toilet.domain.vo.V2ToiletImpDetailVo;
import com.ruoyi.standingbook.v2toilet.enums.ItemStatusEnum;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Slf4j
public class V2ToiletExcelListener extends MyExcelListener<V2ToiletImpDetailVo> {


    private String batchNo;

    public V2ToiletExcelListener(String batchNo) {
        this.batchNo = batchNo;
    }

    @Override
    public void doValidate(V2ToiletImpDetailVo data, AnalysisContext context) {
        // 1.设置批次号
        // 2.校验数据 与 匹配数据字典数据 设置对应字段
        // 3.设置 处理状态 与 处理信息

        // {"0":"序号","1":"项目名称","2":"日期","3":"社区","4":"公厕名称","75":"保洁员","76":"保洁员联系电话","77":"负责人","78":"负责人联系电话","79":"清洁频率（次）","80":"备注"}

        List<String> validateList = new ArrayList<>();
        data.setBatchNo(this.batchNo);

        if (Objects.isNull(data.getCreateDate())) {
            validateList.add("[ 日期 ] 为空");
        }
        if (Objects.isNull(data.getToiletName())) {
            validateList.add("[ 公厕名称 ] 为空");
        }

        JSONObject excelRowData = JSONUtil.parseObj(data);

        //判断巡检项是否为空；统计异常
        int count = 0;
        String cellValue;
        boolean hasErr;
        //绑定巡检项到属性
        for (ItemEnum ti : ItemEnum.values()) {
            hasErr = false;
            cellValue = excelRowData.get(ti.attr, String.class, true);
            //转换为字典值 1，2，4
            if (ItemStatusEnum.ERR.cellValue.equalsIgnoreCase(cellValue)) {
                //如果是 x 设置为 1
                excelRowData.set(ti.attr, ItemStatusEnum.ERR.intCode);
                hasErr = true;
            } else if (ItemStatusEnum.OK.cellValue.equalsIgnoreCase(cellValue)) {
                //如果是 √ 设置为 3
                excelRowData.set(ti.attr, ItemStatusEnum.OK.intCode);
            } else {
                //不是√ 或× 设置为4
                excelRowData.set(ti.attr, ItemStatusEnum.NO_DATA.intCode);
            }
            //转换为字典值 1，2，4 END
            if (hasErr) {      //错误计数
                count += 1;
            }
        }

        //        String str = "flushing";//冲水设备（处理前）
        //        Integer colIndex = this.getHeadColIndex(ItemImageEnum.ORIGINAL_IMAGE.head);
        //        if (Objects.nonNull(colIndex)) {
        //            excelRowData.set(ItemImageEnum.ORIGINAL_IMAGE.attr, this.getPicOssIdOnMap(row, colIndex));
        //        }
        //绑定巡检项图片
        for (ItemImageEnum image : ItemImageEnum.values()) {
            String ossid = this.getPicOssIdOnMap(row, image.index);
            //只有是数字类型的值
            if (StrUtil.isNumeric(ossid)) {
                excelRowData.set(image.attr, ossid);
            }
        }
        //把属性值绑定到对象
        data = JSONUtil.toBean(excelRowData, V2ToiletImpDetailVo.class);
        data.setAnomalyCount(count);
        if (validateList.isEmpty()) {
            data.setProcessMsg("成功");
            data.setProcessStatus(ERecordConstant.COMMON_STATUS_SUCCESS);
        } else {
            String errMsg = String.join(" ，", validateList);
            excelResult.getValidateList().add(errMsg);
            data.setProcessMsg(errMsg);
            data.setProcessStatus(ERecordConstant.COMMON_STATUS_ERROR);

        }
        data.setModCode(ToiletConst.MODIFY_YES);//设置可修改 0 可以修改1不能修改
        String format = DateUtil.format(data.getCreateDate(), "yyyy/MM/dd");
        format = format.concat(data.getToiletName());
        //日期+厕所名称 生成ID
        data.setId(SecureUtil.md5(format));
        excelResult.getList().add(data);

    }

    @Override
    protected void doOnExceptionProcess(String errorMsg) {
        V2ToiletImpDetailVo vo = new V2ToiletImpDetailVo();
        vo.setBatchNo(this.batchNo);
        vo.setProcessStatus(ERecordConstant.COMMON_STATUS_ERROR);
        vo.setProcessMsg(errorMsg);
        this.excelResult.getList().add(vo);


    }
    //
    //    private void checkItems(JSONObject jsonObject, AtomicInteger count) {
    //        //判断巡检项是否为空；统计异常
    //
    //        for (ItemEnum ti : ItemEnum.values()) {
    //            Object ov = jsonObject.get(ti.attr);
    //            //if (Objects.isNull(ov)) {
    //            //                validateList.add("[ ".concat(ti.note).concat(" ] 为空"));
    //            //}
    //            String value = ToiletConst.DICT_CODE_NOVALUE;
    //            //转换为字典值 1，2
    //            if (Objects.equals(ToiletConst.EXCEL_CODE_OK, ov)) {
    //                value = ToiletConst.DICT_CODE_OK;
    //            } else if (Objects.equals(ToiletConst.EXCEL_CODE_NO, ov)) {
    //                value = ToiletConst.DICT_CODE_ERR;
    //            }
    //            jsonObject.set(ti.attr, value);
    //
    //            //错误情况
    //            if (ToiletConst.DICT_CODE_ERR.equalsIgnoreCase(value)) {
    //                count.incrementAndGet();
    //                //增加巡检项 图片
    //                String imageAttr = ti.attr.concat(ToiletConst.EXCEL_IMAGE_BEFORE);
    //                Integer col2 = this.getHeadColIndex(ItemImageEnum.getExcelHead(imageAttr).head);
    //                if (Objects.nonNull(col2)) {
    //                    jsonObject.set(imageAttr, this.getPicOssIdOnMap(row, col2));
    //                }
    //            }//修改 合格 异常 为 1，2
    //
    //        }
    //
    //
    //    }

}
